﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VentaElectrodomesticos.GUI.Base;
using VentaElectrodomesticos.Negocio;
using VentaElectrodomesticos.Datos;
using VentaElectrodomesticos.Contrato;
using VentaElectrodomesticos.GUI.AbmEmpleado;

namespace VentaElectrodomesticos.AbmUsuario
{
    public partial class FormUsuario : BaseEdicion<UsuarioNegocio,UsuarioDAO,Usuario>
    {
        private FormUsuario instance;
        private List<Rol> roles = new List<Rol>();
        private Empleado empleado;


        private FormUsuario getInstance()
        {
            if (this.instance == null)
                this.instance = new FormUsuario();
            instance.BringToFront();
            return instance;
        }

        public FormUsuario()
        {
            InitializeComponent();
            lRoles.DisplayMember = "nombre";
            lRoles.ValueMember = "Id";
        }

        protected override void getValues()
        {
            this.Entity.usuario = tUsuario.Text;

            if (this.Entity.contrasenia != tContrasenia.Text)
            {
                this.Entity.contrasenia = SHAEncrypt.encode(tContrasenia.Text);
            }

            this.Entity.__Roles = getRoles();
            this.Entity.empleado_id = this.empleado.Id;
            this.Entity.inactivo = checkInactivo.Checked;
        }

        private List<Rol> getRoles()
        {
            List<Rol> rolAux = new List<Rol>();
            foreach (Rol rol in this.lRoles.SelectedItems)
                rolAux.Add(rol);
            return rolAux;
        }

        protected override void setValues()
        {
            this.tUsuario.Text = this.Entity.usuario;
            this.tContrasenia.Text = Entity.contrasenia;
            if (this.Entity.inactivo == null) {
                this.Entity.inactivo = false;
            }
            this.checkInactivo.Checked = (Boolean)this.Entity.inactivo;
            if (this.Entity.__empleado != null) {
                this.empleado = this.Entity.__empleado;
                this.tEmpleado.Text = this.empleado.Nombre;
            }
            setRoles(this.Entity.__Roles);
        }

        public override void changeLayout(bool edit)
        {
            base.changeLayout(edit);
            panelCreacion.Visible = !edit;
            panelEdicion.Visible = edit;
        }

        private void setRoles(List<Rol> list)
        {
            lRoles.SelectionMode = SelectionMode.MultiSimple;
            if (this.Entity.__Roles != null) {
                foreach (Rol rol in this.Entity.__Roles)
                {
                    for (int i = 0; i < this.lRoles.Items.Count; i++)
                    {
                        if (rol.Id == ((Rol)this.lRoles.Items[i]).Id)
                            this.lRoles.SetSelected(i, true);
                    }
                }
            }
            
        }

        protected override void OnClosed(EventArgs e)
        {
            this.instance = null;
            base.OnClosed(e);
        }

        private void bBuscar_Click(object sender, EventArgs e)
        {
            this.SearchEmployee();
        }

        private void SearchEmployee()
        {
            FormAbmEmpleado frm = new VentaElectrodomesticos.GUI.AbmEmpleado.FormAbmEmpleado.SelectorEmpleados();
            frm.IsSearchForm = true;
            if (frm.ShowDialog() == DialogResult.OK) {
                this.tEmpleado.Text = frm.Entity.Nombre.ToString();
                this.empleado = frm.Entity;
            }
        }

        public void setAvailableRoles(List<Rol> list)
        {
            lRoles.Items.AddRange(list.ToArray());
        }

        protected override void cumpleValidaciones()
        {
            if(lRoles.SelectedItems.Count < 1) {
                this.Errores.Add("Los roles no son validos.");
            }

            if (!RegCondition.Condition(tEmpleado, RegCondition.RegularExpressions.Alphabet))
                this.Errores.Add("El nombre del empleado no es válido");
            if (!RegCondition.Condition(tUsuario, RegCondition.RegularExpressions.AlphaNumeric))
                this.Errores.Add("El nombre de usuario no es válido");
        }

    }
}
